package DataIO;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;

import Exception.ExceptionBadFileFormat;


/**	
 * Classe réprésentant les Data Communes aux problèmes (demande,capacité max..)
 * @author poko
 *
 */
public class Data {

	/** tableau pour la demande */
	private double demande[][];
	
	/** tableau pour la capacité max */
	private double capacitemax[][];
	
	/** tableau pour le cout */
	private double cout[];
	
	/**
	 * Construit une instance de data, throws ExceptionBadFileFormat si le fichier n'est pas bien formatté
	 * @param file
	 * @throws ExceptionBadFileFormat
	 */
	public Data( String file) throws ExceptionBadFileFormat{
		demande = new double[7][100];
		capacitemax = new double[5][7];
		cout = new double[5];
		try {
			readData( file);
		} catch (InvalidFormatException e) {
			// TODO Auto-generated catch block
			throw new ExceptionBadFileFormat();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 
	 * @return nbjour
	 */
	public int getNbJour(){
		return demande.length;
	}
	
	/**
	 * 
	 * @return NbScenario
	 */
	public int getNbScenario(){
		return demande[0].length;
	}
	
	
	/**
	 * 
	 * @return NbCentral
	 */
	public int getNbCentrale(){
		return cout.length;
	}
	
	/**	
	 * Lis la demande, la capacité et le cout depuis un fichier xls
	 * @param file
	 * @throws IOException 
	 * @throws InvalidFormatException 
	 */
	public void readData(String file) throws InvalidFormatException, IOException{
		InputStream inp = new FileInputStream(file);
		Workbook wb = WorkbookFactory.create(inp);
		Sheet sheet1 = wb.getSheetAt(0);
		int i=0,j=0;
		for (Row row : sheet1) {
			j=0;
			for (Cell cell : row) {
				switch (cell.getCellType()) {
				case Cell.CELL_TYPE_NUMERIC:

					if (!DateUtil.isCellDateFormatted(cell)) {
						demande[j][i]=cell.getNumericCellValue();
					}
					break;
				default:
					//System.out.println();
				}
				j++;
			}
			i++;
		}
		
		Sheet sheet2 = wb.getSheetAt(5);
		ArrayList<Row> rows = new ArrayList<Row>();
		int rowindexs[]={1,3,5,7,9};
		for(int i1 : rowindexs){
			rows.add(sheet2.getRow(i1));
		}

		int columsIndex[] = {1,3,5,7,9,11,13,15};
		j=0;//Colonne
		for (int ci : columsIndex){

			ArrayList<Cell> cells = new ArrayList<Cell>();
			for(Row row :  rows){
				cells.add(row.getCell(ci));
			}
			i = 0 ;//Ligne
			for(Cell cell : cells){

				switch (cell.getCellType()) {

				case Cell.CELL_TYPE_NUMERIC:
					if (!DateUtil.isCellDateFormatted(cell)){
						if(j==0){
							//Cout
							cout[i]=cell.getNumericCellValue();
						}else{
							//Capacité
							capacitemax[i][j-1]=cell.getNumericCellValue();
						}
					}
					break;
				default:
					System.out.println("Probléme de format de cellule");
				}
				i++;
			}
			j++;
		}
		inp.close();
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Data [demande=" + Arrays.deepToString(demande) + ",\n capacitemax="
				+ Arrays.deepToString(capacitemax) + ",\n cout="
				+ Arrays.toString(cout) + "]";
	}

	/**
	 * @return the demande
	 */
	public double[][] getDemande() {
		return demande;
	}

	/**
	 * @return the capacitemax
	 */
	public double[][] getCapacitemax() {
		return capacitemax;
	}

	/**
	 * @return the cout
	 */
	public double[] getCout() {
		return cout;
	}
	
	/**
	 * @return la capacite max pour chaque centrale pendant les nbjours
	 */
	public ArrayList<double[]> getMaxParCentrale(){
		ArrayList<double[]> max= new ArrayList<double[]>();
		for(int i=0; i<this.getNbCentrale(); i++){
			double[] capaciteCentrale = new double[7];
			for(int j=0; j<this.getNbJour(); j++){
				capaciteCentrale[j] = capacitemax[i][j];
			}
			max.add(capaciteCentrale);
		}
		return max;
	}
	
}
